package com.ssy.lingxi.member.merchant.service.base;

import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.member.merchant.entity.*;
import com.ssy.lingxi.member.merchant.model.bo.AddMemberBO;
import com.ssy.lingxi.member.merchant.model.bo.ProcessBO;
import com.ssy.lingxi.member.merchant.model.bo.UpdateMemberRelationBO;
import com.ssy.lingxi.member.merchant.model.bo.UpdatePlatformMemberBO;
import com.ssy.lingxi.member.merchant.model.vo.validate.request.MemberQualityVO;

import java.util.List;
import java.util.Map;

/**
 * 会员、用户内部服务类接口
 * @author 万宁
 * @version 2.0.0
 * @date 2020-08-06
 */
public interface IBaseMemberInnerService {
    /**
     * 新增平台会员
     * @param memberBO 接口参数
     * @return 操作结果
     */
    Wrapper<MemberRelationDO> addPlatformMember(AddMemberBO memberBO);

    /**
     * 新增会员上下级关系（非平台会员）
     * @param upperMember 上级会员
     * @param upperRole   上级会员角色
     * @param subMemberPlatformRelation   下级会员的平台会员关系
     * @param subRole     下级会员角色
     * @param subMemberType 下级会员的会员类型
     * @param subMemberLevel  下级会员的等级
     * @param subMemberLevelTypeEnum 下级会员的等级类型
     * @param subMemberChannel  下级会员的渠道信息
     * @return 操作结果
     */
    Wrapper<Void> addMemberRelation(MemberDO upperMember, RoleDO upperRole, MemberRelationDO subMemberPlatformRelation, RoleDO subRole, MemberTypeDO subMemberType, Integer subMemberLevel, Integer subMemberLevelTypeEnum, MemberChannelDO subMemberChannel);

    /**
     * 修改平台会员信息
     * @param updateBO 接口参数
     * @return 操作结果
     */
    Wrapper<Void> updatePlatformMember(UpdatePlatformMemberBO updateBO);

    /**
     * 修改会员上下级关系
     * @param updateRelationBO 接口参数
     * @return 操作结果
     */
    Wrapper<Void> updateMemberRelation(UpdateMemberRelationBO updateRelationBO);

    /**
     * 删除平台会员
     * @param memberDO 要删除的会员
     * @param relationDO 要删除的与平台会员的上下级关系
     * @return 操作结果
     */
    Wrapper<Void> deletePlatformMember(MemberDO memberDO, MemberRelationDO relationDO);

    /**
     * 删除上下级关系
     * @param relationDO 上下级关系
     * @return 操作结果
     */
    Wrapper<Void> deleteMemberRelation(MemberRelationDO relationDO);

    /**
     * 删除平台会员和角色
     * @param relationDO 平台会员上下级关系
     * @return 删除结果
     */
    Wrapper<Void> deletePlatformMemberAndRole(MemberRelationDO relationDO);

    /**
     * 会员只有一个角色的情况下，彻底删除平台会员和角色
     * @param memberDO 要删除的会员
     * @param roleDO 要删除的角色
     * @return 删除结果
     */
    Wrapper<Void> deleteMemberCompletely(MemberDO memberDO, RoleDO roleDO);

    /**
     * 新增角色
     * @param processBO 角色关联的平台会员审核流程
     * @param operatorRoleName 登录用户的当前会员角色
     * @param adminMemberDO 平台管理员
     * @param adminRole 平台管理员的角色
     * @param memberDO 会员
     * @param roleDO 新增的角色
     * @param memberAdminRole 会员下属的管理员角色
     * @param memberAdminUser 会员下属的管理员
     * @param memberName 会员名称
     * @param memberRegisterDetails 注册资料
     * @return 新增结果
     */
    Wrapper<Void> addMemberRole(ProcessBO processBO, String operatorRoleName, MemberDO adminMemberDO, RoleDO adminRole, MemberDO memberDO, RoleDO roleDO, MemberRoleDO memberAdminRole, MemberUserDO memberAdminUser, String memberName, List<MemberRegisterDetailDO> memberRegisterDetails);

    /**
     * 下级会员申请成为上级会员的下级
     * @param upperMemberId 上级会员Id
     * @param upperRoleId    上级会员角色Id
     * @param subMemberId 下级会员Id
     * @param subRoleId 下级会员角色Id
     * @param depositDetails 入库资料
     * @param qualities 资质证明文件
     * @return 操作结果
     */
    Wrapper<Void> applyToBeSubMember(Long upperMemberId, Long upperRoleId, Long subMemberId, Long subRoleId, Map<String, Object> depositDetails, List<MemberQualityVO> qualities);

    /**
     * 会员被淘汰后，重新申请为下级会员
     * @param relationDO 被淘汰的会员关系
     * @return 操作结果
     */
    Wrapper<Void> reApplyForSubMember(MemberRelationDO relationDO);
}
